home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 May: Tool Chest / Developer CD Series May 1996 (Tool Chest) (Apple Computer) (1996).iso / Sample Code / AppsToGo / Kibitz / CMQueenMate.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-09-22  |  4.3 KB  |  178 lines  |  [TEXT/MPS ]

  1. /*
  2. ** Apple Macintosh Developer Technical Support
  3. **
  4. ** File:        cmqueenmate.c
  5. ** Written by:  Eric Soldan
  6. **
  7. ** Copyright © 1990-1992 Apple Computer, Inc.
  8. ** All rights reserved. */
  9.  
  10.  
  11.  
  12. /*****************************************************************************/
  13.  
  14.  
  15.  
  16. #include "Kibitz.h"                /* Get the Kibitz includes/typedefs, etc.    */
  17. #include "KibitzCommon.h"        /* Get the stuff in common with rez.        */
  18. #include "Kibitz.protos"        /* Get the prototypes for Kibitz.            */
  19.  
  20.  
  21.  
  22. /*****************************************************************************/
  23.  
  24.  
  25.  
  26. extern short    gPieceLoc;
  27.  
  28.  
  29.  
  30. /*****************************************************************************/
  31. /*****************************************************************************/
  32.  
  33. #ifdef applec
  34. #pragma segment Chess
  35. #endif
  36.  
  37. /*****************************************************************************/
  38. /*****************************************************************************/
  39.  
  40.  
  41.  
  42. short    QueenMate(FileRecHndl game)
  43. {
  44.     short            color, myKingLoc, opKingLoc, pieceLoc;
  45.     short            mkr, mkc, okr, okc, pr, pc, row, col;
  46.     short            dr, dc, absdr, absdc;
  47.     short            from, to, val, minVal, minMove;
  48.     short            rspin;
  49.     Boolean            pieceBetween, hflip;
  50.     MoveListHndl    moves;
  51.     short            num, move;
  52.  
  53.     GenerateLegalMoves(game);
  54.     num   = (*game)->doc.numLegalMoves;
  55.     moves = (*game)->doc.legalMoves;
  56.  
  57.     color = WhosMove(game);
  58.     myKingLoc = (*game)->doc.king[color].kingLoc;
  59.     opKingLoc = (*game)->doc.king[1 - color].kingLoc;
  60.     pieceLoc  = gPieceLoc;
  61.  
  62.     for (rspin = 0; rspin < 4; ++rspin) {        /* Rotate until okr < pr < mkr. */
  63.         GetDeltas(pieceLoc, opKingLoc, &dr, &dc, &absdr, &absdc);
  64.         if (dr > 0) {
  65.             GetDeltas(myKingLoc, pieceLoc, &dr, &dc, &absdr, &absdc);
  66.             if (dr > 0) break;
  67.         }
  68.         RSpinPosition(&myKingLoc);
  69.         RSpinPosition(&opKingLoc);
  70.         RSpinPosition(&pieceLoc);
  71.         for (move = 0; move < num; ++move) {
  72.             RSpinPosition(&(**moves)[move].moveFrom);
  73.             RSpinPosition(&(**moves)[move].moveTo);
  74.         }
  75.     }
  76.  
  77.     pieceBetween = (rspin < 4);
  78.     if (!pieceBetween) {
  79.         for (rspin = 0; rspin < 4; ++rspin) {    /* Rotate until myKing 2+ rows below opKing. */
  80.             GetDeltas(myKingLoc, opKingLoc, &dr, &dc, &absdr, &absdc);
  81.             if (dr > 1) break;
  82.             RSpinPosition(&myKingLoc);
  83.             RSpinPosition(&opKingLoc);
  84.             RSpinPosition(&pieceLoc);
  85.             for (move = 0; move < num; ++move) {
  86.                 RSpinPosition(&(**moves)[move].moveFrom);
  87.                 RSpinPosition(&(**moves)[move].moveTo);
  88.             }
  89.         }
  90.     }
  91.  
  92.     GetRowCol(opKingLoc, &okr, &okc);
  93.     hflip = false;
  94.     if (okc > 3) hflip = true;        /* Position opponent king on left side of board. */
  95.     if (hflip) {
  96.         HFlipPosition(&myKingLoc);
  97.         HFlipPosition(&opKingLoc);
  98.         HFlipPosition(&pieceLoc);
  99.         for (move = 0; move < num; ++move) {
  100.             HFlipPosition(&(**moves)[move].moveFrom);
  101.             HFlipPosition(&(**moves)[move].moveTo);
  102.         }
  103.     }
  104.  
  105.     GetRowCol(myKingLoc, &mkr, &mkc);
  106.     GetRowCol(opKingLoc, &okr, &okc);
  107.     GetRowCol(pieceLoc,  &pr,  &pc);
  108.  
  109.     if (!pieceBetween) {
  110.         if ((pr >= mkr) || (pr < okr)) {
  111.             for (minVal = 16, move = 0; move < num; ++move) {
  112.                 from = (**moves)[move].moveFrom;
  113.                 to   = (**moves)[move].moveTo;
  114.                 if (from == pieceLoc) {            /* If piece move... */
  115.                     GetRowCol(to, &row, &col);
  116.                     val = row - okr;
  117.                     if (val < 1) val = 7;
  118.                     GetDeltas(to, opKingLoc, &dr, &dc, &absdr, &absdc);
  119.                     if (absdc < 3) {
  120.                         if (val == 1) val = 7;
  121.                         if (val == 2) val += (3 - absdc);
  122.                     }
  123.                     if (minVal > val) {
  124.                         minVal = val;
  125.                         minMove = move;
  126.                     }
  127.                 }
  128.             }
  129.             GenerateLegalMoves(game);
  130.             return(minMove);
  131.         }
  132.     }
  133.  
  134.     GetDeltas(pieceLoc, opKingLoc, &dr, &dc, &absdr, &absdc);
  135.     from = pieceLoc;
  136.     to = 0;
  137.     for (;;) {
  138.         if (dc < 0) {
  139.             to = from + (okc - pc) + 1;
  140.             if (absdr == 1) ++to;
  141.             break;
  142.         }
  143.         if (dr > 1) {
  144.             to = from - 10 * (dr - 1);
  145.             if (dc == 1) to += (dr - 1);
  146.             if ((opKingLoc == START_IBNDS) && (to == (START_IBNDS + 12))) to += 10;
  147.             break;
  148.         }
  149.         if (!okr) {
  150.             to = opKingLoc + 12;
  151.             if (!okc) ++to;
  152.             if (from != to) break;
  153.         }
  154.         else if ((to = opKingLoc + 12) != from) break;
  155.  
  156.         from = to = myKingLoc;
  157.         if (!mkc) ++to;
  158.         if (mkc > 1) --to;
  159.         if ((mkr - pr) > 1) to -= 10;
  160.         if (to == from) --to;
  161.  
  162.         break;
  163.     }
  164.  
  165.     for (move = 0; move < num; ++move) {
  166.         if ((from == (**moves)[move].moveFrom) && (to == (**moves)[move].moveTo)) {
  167.             GenerateLegalMoves(game);
  168.             return(move);
  169.         }
  170.     }
  171.  
  172.     GenerateLegalMoves(game);        /* This should never happen. */
  173.     return(0);
  174. }
  175.  
  176.  
  177.  
  178.